package org.rslai.autotest.core.page;

import java.util.LinkedList;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

/**
 * 表格处理方法
 * @author rslai
 */
public interface Table {

	/**
	 * 根据匹配内容返回一个表格的文本内容
	 * @param matchColumn 按第几列匹配，从0开始。例：如果想匹配第0列内容为“添加”此参数设置为 0
	 * @param matchStr 匹配字符串，例：如果想匹配第0列内容为“添加”此参数设置为 "添加"
	 * @param column 返回列号, 从0开始
	 * @return 表格文本内容
	 */
	public String getCellText(int matchColumn, String matchStr, int column);

	/**
	 * 根据匹配内容返回一个表格的 WebElement 对象
	 * @param matchColumn 按第几列匹配，从0开始。例：如果想匹配第0列内容为“添加”此参数设置为 0
	 * @param matchStr 匹配字符串，例：如果想匹配第0列内容为“添加”此参数设置为 "添加"
	 * @param column 返回列号, 从0开始
	 * @return WebElement 对象，注：如果要在这个WebElement上使用 xpath 搜索，要在前边加 child::node() <br>
	 * 例1：By.xpath("../child::node()//span[@class='del']") 或 By.xpath(".//span[@class='del']") 在当前对象下查找<br>
	 * 例2：By.xpath("child::node()//span[@class='del']") 在当前对象的子对象下查找
	 */
	public WebElement getCell(int matchColumn, String matchStr, int column);

	/**
	 * 根据匹配内容返回一列  WebElement 对象
	 * @param matchColumn 按第几列匹配，从0开始。例：如果想匹配第0列内容为“添加”此参数设置为 0
	 * @param matchStr 匹配字符串，例：如果想匹配第0列内容为“添加”此参数设置为 "添加"
	 * @param column 返回列号, 从0开始
	 * @return 一组 WebElement 对象，注：如果要在这个WebElement上使用 xpath 搜索，要在前边加 child::node() <br>
	 * 例1：By.xpath("../child::node()//span[@class='del']") 或 By.xpath(".//span[@class='del']") 在当前对象下查找<br>
	 * 例2：By.xpath("child::node()//span[@class='del']") 在当前对象的子对象下查找
	 */
	public LinkedList<WebElement> getCells(int matchColumn, String matchStr, int column);

	/**
	 * 返回一列  WebElement 对象
	 * @param column 返回列号, 从0开始
	 * @return 一组 WebElement 对象，注：如果要在这个WebElement上使用 xpath 搜索，要在前边加 child::node() <br>
	 * 例1：By.xpath("../child::node()//span[@class='del']") 或 By.xpath(".//span[@class='del']") 在当前对象下查找<br>
	 * 例2：By.xpath("child::node()//span[@class='del']") 在当前对象的子对象下查找
	 */
	public LinkedList<WebElement> getCells(int column);

	/**
	 * 根据匹配内容返回一行  WebElement 对象
	 * @param matchColumn 按第几列匹配，从0开始。例：如果想匹配第0列内容为“添加”此参数设置为 0
	 * @param matchStr 匹配字符串，例：如果想匹配第0列内容为“添加”此参数设置为 "添加"
	 * @return 一组 WebElement 对象，注：如果要在这个WebElement上使用 xpath 搜索，要在前边加 child::node() <br>
	 * 例1：By.xpath("../child::node()//span[@class='del']") 或 By.xpath(".//span[@class='del']") 在当前对象下查找<br>
	 * 例2：By.xpath("child::node()//span[@class='del']") 在当前对象的子对象下查找
	 */
	public LinkedList<WebElement> getRow(int matchColumn, String matchStr);

	/**
	 * 根据匹配内容返回所有行的  WebElement 对象
	 * @param matchColumn 按第几列匹配，从0开始。例：如果想匹配第0列内容为“添加”此参数设置为 0
	 * @param matchStr 匹配字符串，例：如果想匹配第0列内容为“添加”此参数设置为 "添加"
	 * @return 一组 WebElement 对象，注：如果要在这个WebElement上使用 xpath 搜索，要在前边加 child::node() <br>
	 * 例1：By.xpath("../child::node()//span[@class='del']") 或 By.xpath(".//span[@class='del']") 在当前对象下查找<br>
	 * 例2：By.xpath("child::node()//span[@class='del']") 在当前对象的子对象下查找
	 */
	public LinkedList<LinkedList<WebElement>> getRows(int matchColumn, String matchStr);

	/**
	 * 返回所有行
	 * @return 一组 WebElement 对象，注：如果要在这个WebElement上使用 xpath 搜索，要在前边加 child::node() <br>
	 * 例1：By.xpath("../child::node()//span[@class='del']") 或 By.xpath(".//span[@class='del']") 在当前对象下查找<br>
	 * 例2：By.xpath("child::node()//span[@class='del']") 在当前对象的子对象下查找
	 */
	public LinkedList<LinkedList<WebElement>> getRows();

	/**
	 * 返回一行  WebElement 对象
	 * @param row 行号, 从0开始
	 * @return 一组 WebElement 对象，注：如果要在这个WebElement上使用 xpath 搜索，要在前边加 child::node() <br>
	 * 例1：By.xpath("../child::node()//span[@class='del']") 或 By.xpath(".//span[@class='del']") 在当前对象下查找<br>
	 * 例2：By.xpath("child::node()//span[@class='del']") 在当前对象的子对象下查找
	 */
	public LinkedList<WebElement> getRow(int row);

	/**
	 * 返回一个表格的文本内容
	 * @param row 行号, 从0开始
	 * @param column 列号, 从0开始
	 * @return 表格文本内容
	 */
	public String getCellText(int row, int column);

	/**
	 * 返回一个表格的 WebElement 对象
	 * @param row 行号, 从0开始
	 * @param column 列号, 从0开始
	 * @return WebElement 对象，注：如果要在这个WebElement上使用 xpath 搜索，要在前边加 child::node() <br>
	 * 例1：By.xpath("../child::node()//span[@class='del']") 或 By.xpath(".//span[@class='del']") 在当前对象下查找<br>
	 * 例2：By.xpath("child::node()//span[@class='del']") 在当前对象的子对象下查找
	 */
	public WebElement getCell(int row, int column);

	/**
	 * 设置表格数据，根据提供的by遍历所有table，然后设置表格数据
	 * @param by By对象，例如有如下html <br>
	 * &lt;table&gt;&lt;tr&gt;&lt;th&gt;1&lt;/th&gt;&lt;th&gt;2&lt;/th&gt;&lt;/tr&gt;&lt;/table&gt; <br>
	 * &lt;table&gt;&lt;tr&gt;&lt;td&gt;text1&lt;/td&gt;&lt;td&gt;text2&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; <br>
	 * 例1：html代码那两个table第一个是title第二个是body可以写成 new By[]{By.xpath("//table")} 这样xpaht会匹配上两个对象之后遍历 <br>
	 * 例2：同样上边html代码也可以写成 new By[]{By.xpath("//table[2]")}<br>
	 * @return 返回 Table
	 */
	public Table setTableData(By by);

	/**
	 * 设置表格数据，根据提供的bys遍历所有table，然后设置表格数据
	 * @param bys By对象数组，例如有如下html <br>
	 * &lt;table&gt;&lt;tr&gt;&lt;th&gt;1&lt;/th&gt;&lt;th&gt;2&lt;/th&gt;&lt;/tr&gt;&lt;/table&gt; <br>
	 * &lt;table&gt;&lt;tr&gt;&lt;td&gt;text1&lt;/td&gt;&lt;td&gt;text2&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; <br>
	 * 例1：html代码那两个table第一个是title第二个是body可以写成 new By[]{By.xpath("//table")} 这样xpaht会匹配上两个对象之后遍历 <br>
	 * 例2：同样上边html代码也可以写成 new By[]{By.xpath("//table[2]")}<br>
	 * 例3：这里允许写个数组，就是如果不能用一个xpath返回所有table那可以写多个By返回所有表
	 * @return 返回 Table
	 */
	public Table setTableData(By[] bys);

}
